package com.example.demo.common;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.example.demo.entity.User;
import com.example.demo.service.UserServiceImpl;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Date;

@Component
public class JwtTokenUtils {
    private static UserServiceImpl staticUserServiceImpl;
    private static final Logger log = LoggerFactory.getLogger(JwtTokenUtils.class);
    @Resource
    private UserServiceImpl userService;
    @PostConstruct
    public void setUserService(){
        staticUserServiceImpl=userService;
    }
    /**
     * 生成token
     */
    public static String genToken(String UserID,String password){
        return JWT.create().withAudience(UserID) // 将user id 保存到 token 里面，作为载荷
                .withExpiresAt(DateUtil.offsetHour(new Date(),2)) // 2小时后token过期
                .sign(Algorithm.HMAC256(password)); // 以 password 作为token的密钥
    }
    /**
     * 获取当前用户的信息
     */
    public static User getCurrentUser(){
        String token = null;
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
            token = request.getHeader("token");
            if (StrUtil.isBlank(token))
                token=request.getParameter("token");
            if (StrUtil.isBlank(token)){
                log.error("获取当前登录的token失败，token:{}",token);
                return null;
            }
            //解析token，获取用户的id
            String UserID = JWT.decode(token).getAudience().get(0);
            return staticUserServiceImpl.findByById(Integer.valueOf(UserID));
        }catch (Exception e){
            log.error("获取当前登录用户信息失败，token={}",token);
            return null;
        }
    }
}
